import os
import sys
import tkinter as tk
from tkinter import filedialog, messagebox
from docx2pdf import convert

# 禁用tqdm进度条，避免可能的错误
os.environ['TQDM_DISABLE'] = '1'


class DummyFile:
    def write(self, *args, **kwargs):
        pass

    def flush(self):
        pass


# 隐藏控制台时，重定向 stdout 和 stderr
sys.stdout = DummyFile()
sys.stderr = DummyFile()


def word_to_pdf(input_path, output_path=None):
    """
    将Word文档转换为PDF

    参数:
        input_path: Word文档路径
        output_path: 输出PDF路径，如果不指定，将使用与输入文件相同的名称但扩展名为.pdf
    """
    if output_path is None:
        # 自动生成输出文件名（替换扩展名）
        base_name = os.path.splitext(input_path)[0]
        output_path = f"{base_name}.pdf"

    try:
        # 执行转换
        convert(input_path, output_path)
        result_label.config(text=f"已将 {input_path} 转换为 {output_path}")

        # 转换成功后显示消息框
        messagebox.showinfo("转换成功", f"已将Word文档成功转换为PDF:\n{output_path}")
    except Exception as e:
        # 转换失败时显示错误信息
        error_msg = str(e)
        result_label.config(text=f"转换失败: {error_msg}")
        messagebox.showerror("转换失败", f"转换过程中出错:\n{error_msg}")


def select_input_file():
    input_file = filedialog.askopenfilename(filetypes=[("Word 文件", "*.docx"), ("所有文件", "*.*")])
    if input_file:
        input_entry.delete(0, tk.END)
        input_entry.insert(0, input_file)

        # 自动生成默认输出路径 - 同级目录下同名但后缀为pdf的文件
        base_name = os.path.splitext(input_file)[0]
        default_output = f"{base_name}.pdf"

        output_entry.delete(0, tk.END)
        output_entry.insert(0, default_output)


def select_output_file():
    # 获取输入文件路径作为初始目录
    initial_dir = os.path.dirname(input_entry.get()) if input_entry.get() else os.getcwd()
    # 获取默认文件名
    default_filename = ""
    if input_entry.get():
        base_name = os.path.splitext(os.path.basename(input_entry.get()))[0]
        default_filename = f"{base_name}.pdf"

    output_file = filedialog.asksaveasfilename(
        defaultextension=".pdf",
        filetypes=[("PDF 文件", "*.pdf"), ("所有文件", "*.*")],
        initialdir=initial_dir,
        initialfile=default_filename
    )

    if output_file:
        output_entry.delete(0, tk.END)
        output_entry.insert(0, output_file)


def convert_file():
    input_path = input_entry.get()
    output_path = output_entry.get()

    # 检查输入文件是否存在
    if not input_path:
        messagebox.showerror("错误", "请选择Word文档!")
        return

    if not os.path.exists(input_path):
        messagebox.showerror("错误", f"输入文件不存在: {input_path}")
        return

    # 如果没有指定输出路径，则使用默认路径
    if not output_path:
        base_name = os.path.splitext(input_path)[0]
        output_path = f"{base_name}.pdf"
        output_entry.delete(0, tk.END)
        output_entry.insert(0, output_path)

    # 执行转换
    word_to_pdf(input_path, output_path)


# 创建主窗口
root = tk.Tk()
root.title("Word 转 PDF")
root.geometry("600x350")  # 设置窗口大小

# 创建主框架
main_frame = tk.Frame(root, padx=20, pady=20)
main_frame.pack(fill=tk.BOTH, expand=True)

# 创建输入文件选择部分
input_frame = tk.Frame(main_frame)
input_frame.pack(fill=tk.X, pady=10)

input_label = tk.Label(input_frame, text="输入Word文件:", width=15, anchor="w")
input_label.pack(side=tk.LEFT, padx=5)

input_entry = tk.Entry(input_frame)
input_entry.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=5)

input_button = tk.Button(input_frame, text="浏览", command=select_input_file, width=8)
input_button.pack(side=tk.LEFT, padx=5)

# 创建输出文件选择部分
output_frame = tk.Frame(main_frame)
output_frame.pack(fill=tk.X, pady=10)

output_label = tk.Label(output_frame, text="输出PDF文件:", width=15, anchor="w")
output_label.pack(side=tk.LEFT, padx=5)

output_entry = tk.Entry(output_frame)
output_entry.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=5)

output_button = tk.Button(output_frame, text="浏览", command=select_output_file, width=8)
output_button.pack(side=tk.LEFT, padx=5)

# 创建转换按钮
button_frame = tk.Frame(main_frame)
button_frame.pack(pady=20)

convert_button = tk.Button(
    button_frame,
    text="开始转换",
    command=convert_file,
    width=15,
    height=2,
    bg="#4CAF50",
    fg="#FFFFFF",
    font=("Arial", 10, "bold")
)
convert_button.pack()

# 创建结果显示标签
result_label = tk.Label(main_frame, text="", fg="blue", wraplength=500, justify="left")
result_label.pack(pady=10, fill="x")

# 添加说明文字
info_label = tk.Label(main_frame, text="说明: 默认输出文件将保存在与输入文件相同的位置，保持同名并更改扩展名为.pdf",
                     fg="gray", font=("Arial", 9))
info_label.pack(side=tk.BOTTOM, pady=10)

# >>> 添加超链接 <<<
link_label = tk.Label(main_frame, text="Gitee源码(author:前端没钱)", fg="blue", cursor="hand2", font=("Arial", 9))
link_label.pack(side=tk.BOTTOM, pady=5)


# 跳转源码
def jump_to_code(event):
    import webbrowser
    webbrowser.open_new(r"https://gitee.com/ruirui-study/python-word-to-pdf-gui")


link_label.bind("<Button-1>", jump_to_code)


# 杀死进程
def on_closing():
    root.destroy()
    sys.exit(0)


root.protocol("WM_DELETE_WINDOW", on_closing)

# 运行主循环
if __name__ == "__main__":
    root.mainloop()
